package hwThree5;

import edu.princeton.cs.algs4.ST;

public class SET<Key extends Comparable<Key>> {
    private ST<Key, Boolean> st; // 使用符号表存储元素，值用布尔型

    // 构造函数，初始化一个空集合
    public SET() {
        st = new ST<>();
    }

    // 向集合中添加一个元素
    public void add(Key key) {
        st.put(key, true); // 将键和一个固定的布尔值存入符号表
    }

    // 检查集合是否包含某个元素
    public boolean contains(Key key) {
        return st.contains(key);
    }

    // 从集合中删除一个元素
    public void delete(Key key) {
        st.delete(key); // 删除符号表中的键
    }

    // 返回集合的大小
    public int size() {
        return st.size();
    }

    // 检查集合是否为空
    public boolean isEmpty() {
        return st.isEmpty();
    }

    // 返回集合中的所有元素
    public Iterable<Key> keys() {
        return st.keys(); // 返回符号表中所有键
    }

    // 集合的字符串表示形式
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (Key key : st.keys()) {
            sb.append(key).append(" ");
        }
        return sb.toString().trim();
    }

    // 测试代码
    public static void main(String[] args) {
        SET<String> set = new SET<>();

        // 添加元素
        set.add("A");
        set.add("B");
        set.add("C");

        // 检查是否包含某个元素
        System.out.println("Contains A? " + set.contains("A")); // true
        System.out.println("Contains D? " + set.contains("D")); // false

        // 删除元素
        set.delete("B");

        // 集合的大小
        System.out.println("Size: " + set.size()); // 2

        // 是否为空
        System.out.println("Is empty? " + set.isEmpty()); // false

        // 遍历集合
        System.out.println("Keys: " + set);

        // 添加重复元素
        set.add("A");
        System.out.println("After adding duplicate A: " + set); // Still only one A
    }
}
